#include<iostream>
using namespace std;
int a[200][200];
int f[200][200];
int r,c;
int dfs(int x,int y){
    if(x>r||x<1||y>c||y<1){
        return 0;
    }
    int ans=0;
    if(f[x][y]!=-1)return f[x][y];
    if(a[x+1][y]<a[x][y])ans=max(ans,dfs(x+1,y));
    if(a[x][y+1]<a[x][y])ans=max(ans,dfs(x,y+1));
    if(a[x-1][y]<a[x][y])ans=max(ans,dfs(x-1,y));
    if(a[x][y-1]<a[x][y])ans=max(ans,dfs(x,y-1));
    f[x][y]=ans+1;
    return f[x][y];
}
int main(){
    memset(f,-1,sizeof(f));
    cin>>r>>c;
    int x,y;
    int maxn=0;
    for(int i=1;i<=r;i++){
        for(int j=1;j<=c;j++){
            cin>>a[i][j];
        }
    }
    int ans=0;
   for(int i=1;i<=r;i++){
    for(int j=1;j<=c;j++){
        ans=max(dfs(i,j),ans);
    }
   }
    cout<<ans;
    return 0;
}